package com.obggtc.picture.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.obggtc.picture.entity.MediaFile;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 媒体文件Mapper接口
 */
@Mapper
public interface MediaFileMapper extends BaseMapper<MediaFile> {
    
    /**
     * 分页查询用户的媒体文件
     * @param page 分页对象
     * @param uploader 上传者
     * @param fileType 文件类型（可选）
     * @param status 状态
     * @return 分页结果
     */
    @Select("<script>" +
            "SELECT * FROM media_file " +
            "WHERE uploader = #{uploader} AND status = #{status} " +
            "<if test='fileType != null'> AND file_type = #{fileType} </if>" +
            "ORDER BY create_time DESC" +
            "</script>")
    IPage<MediaFile> selectUserMediaFiles(Page<MediaFile> page, 
                                         @Param("uploader") String uploader,
                                         @Param("fileType") Integer fileType,
                                         @Param("status") Integer status);
    
    /**
     * 根据标签搜索媒体文件
     * @param page 分页对象
     * @param tag 标签
     * @param fileType 文件类型（可选）
     * @param status 状态
     * @return 分页结果
     */
    @Select("<script>" +
            "SELECT * FROM media_file " +
            "WHERE FIND_IN_SET(#{tag}, tags) > 0 AND status = #{status} " +
            "<if test='fileType != null'> AND file_type = #{fileType} </if>" +
            "ORDER BY view_count DESC, create_time DESC" +
            "</script>")
    IPage<MediaFile> selectMediaFilesByTag(Page<MediaFile> page,
                                          @Param("tag") String tag,
                                          @Param("fileType") Integer fileType,
                                          @Param("status") Integer status);
    
    /**
     * 获取最近上传的媒体文件
     * @param fileType 文件类型（可选）
     * @param status 状态
     * @param limit 限制数量
     * @return 媒体文件列表
     */
    @Select("<script>" +
            "SELECT * FROM media_file " +
            "WHERE status = #{status} " +
            "<if test='fileType != null'> AND file_type = #{fileType} </if>" +
            "ORDER BY create_time DESC " +
            "LIMIT #{limit}" +
            "</script>")
    List<MediaFile> selectRecentMediaFiles(@Param("fileType") Integer fileType,
                                          @Param("status") Integer status,
                                          @Param("limit") Integer limit);
    
    /**
     * 获取热门媒体文件
     * @param fileType 文件类型（可选）
     * @param status 状态
     * @param limit 限制数量
     * @return 媒体文件列表
     */
    @Select("<script>" +
            "SELECT * FROM media_file " +
            "WHERE status = #{status} " +
            "<if test='fileType != null'> AND file_type = #{fileType} </if>" +
            "ORDER BY view_count DESC, create_time DESC " +
            "LIMIT #{limit}" +
            "</script>")
    List<MediaFile> selectHotMediaFiles(@Param("fileType") Integer fileType,
                                       @Param("status") Integer status,
                                       @Param("limit") Integer limit);
    
    /**
     * 增加观看次数
     * @param fileId 文件ID
     * @return 影响行数
     */
    @Update("UPDATE media_file SET view_count = view_count + 1 WHERE file_id = #{fileId}")
    int incrementViewCount(@Param("fileId") String fileId);
    
    /**
     * 增加下载次数
     * @param fileId 文件ID
     * @return 影响行数
     */
    @Update("UPDATE media_file SET download_count = download_count + 1 WHERE file_id = #{fileId}")
    int incrementDownloadCount(@Param("fileId") String fileId);
    
    /**
     * 统计用户媒体文件数量
     * @param uploader 上传者
     * @param fileType 文件类型（可选）
     * @param status 状态
     * @return 数量
     */
    @Select("<script>" +
            "SELECT COUNT(*) FROM media_file " +
            "WHERE uploader = #{uploader} AND status = #{status} " +
            "<if test='fileType != null'> AND file_type = #{fileType} </if>" +
            "</script>")
    Long countUserMediaFiles(@Param("uploader") String uploader,
                            @Param("fileType") Integer fileType,
                            @Param("status") Integer status);
}
